#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
#include <iostream>
#include <vector>
using websocketpp::lib::bind;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;

typedef websocketpp::server<websocketpp::config::asio> server;

// 定义消息处理器
void on_message(server *s, websocketpp::connection_hdl hdl, server::message_ptr msg)
{
    // 获取二进制数据（以 std::string 形式存储）
    const std::string &payload = msg->get_raw_payload();

    // 如果需要以 uint8_t 形式访问数据，可以这样操作：
    const uint8_t *data = reinterpret_cast<const uint8_t *>(payload.data());
    std::vector<uint8_t> binary_data(data, data + payload.size());
    std::cout << "recv 二进制数据长度: " << binary_data.size() << std::endl;

    std::cout << "recv msg: ";
    for (int i = 0; i < binary_data.size(); ++i)
    {
        printf("%02X ", binary_data[i]);
    }
    std::cout << std::endl;
}

int main()
{
    server ws_server;

    // 初始化 ASIO
    ws_server.init_asio();

    // 设置消息处理器
    ws_server.set_message_handler(bind(&on_message, &ws_server, ::_1, ::_2));

    // 监听端口 9002
    ws_server.listen(9002);

    // 开始接受连接
    ws_server.start_accept();

    std::cout << "Server started on port 9002" << std::endl;

    // 运行事件循环
    ws_server.run();

    return 0;
}